﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace SemiCASE.UserControls
{
    public partial class TarihTextBox : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DogrulamaAyarla();
                KontrolunEnableDurumunuAyarla(uciAktif);
                if (uciTarihJsEventAktif) HiddenFieldJsEventAktif.Value = "0";
            }
        }


        #region "Properties"

        public bool Visible
        {
            get { return ViewState["uciVisible"] == null ? true : (bool)ViewState["uciVisible"]; }
            set { ViewState["uciVisible"] = value; KontrolVisibleAyari(value); }
        }

        /// <summary>
        /// Bu parametreye bir ValidationGroup verildiğinde zorunluluk ve aralık (range) kontrolü yapılacak demektir
        /// </summary>
        public string uciDogrulamaGrubu
        {
            get { return ViewState["uciDogrulamaGrubu"] == null ? String.Empty : (string)ViewState["uciDogrulamaGrubu"]; }
            set { ViewState["uciDogrulamaGrubu"] = value; DogrulamaAyarla(); }
        }

        public bool uciAktif
        {
            get { return ViewState["uciAktif"] == null ? true : (bool)ViewState["uciAktif"]; }
            set { ViewState["uciAktif"] = value; KontrolunEnableDurumunuAyarla(value); }
        }

        /// <summary>
        /// Girilebilecek minimum yıl değeridir. uciAktif olabilmesi için uciDogrulamaGrubu parametresine değer verilmelidir.
        /// </summary>
        public int uciTarihAraligiMinimumYil
        {
            get { return ViewState["uciTarihAraligiMinimumYil"] == null ? DateTime.MinValue.Year : (int)ViewState["uciTarihAraligiMinimumYil"]; }
            set { ViewState["uciTarihAraligiMinimumYil"] = value; HiddenFieldMinimumYil.Value = value.ToString(); }
        }

        /// <summary>
        /// Girilebilecek maksimum yıl değeridir. uciAktif olabilmesi için uciDogrulamaGrubu parametresine değer verilmelidir.
        /// </summary>
        public int uciTarihAraligiMaksimumYil
        {
            get { return ViewState["uciTarihAraligiMaksimumYil"] == null ? DateTime.MaxValue.Year : (int)ViewState["uciTarihAraligiMaksimumYil"]; }
            set { ViewState["uciTarihAraligiMaksimumYil"] = value; HiddenFieldMaksimumYil.Value = value.ToString(); }
        }
        public DateTime uciMinumumTarih
        {
            get { return ViewState["uciMinumumTarih"] == null ? DateTime.MinValue : (DateTime)ViewState["uciMinumumTarih"]; }
            set { ViewState["uciMinumumTarih"] = value; MinumumTarihKaydet(value); }
        }
        public DateTime uciMaksimumTarih
        {
            get { return ViewState["uciMaksimumTarih"] == null ? DateTime.MaxValue : (DateTime)ViewState["uciMaksimumTarih"]; }
            set { ViewState["uciMaksimumTarih"] = value; MaksimumTarihKaydet(value); }
        }

        public bool uciTarihJsEventAktif
        {
            get { return ViewState["uciTarihJsEventAktif"] == null ? false : (bool)ViewState["uciTarihJsEventAktif"]; }
            set { ViewState["uciTarihJsEventAktif"] = value; if (value) HiddenFieldJsEventAktif.Value = "1"; else HiddenFieldJsEventAktif.Value = "0"; }
        }
        public bool uciSaltOkunur
        {
            get { return ViewState["uciSaltOkunur"] == null ? false : (bool)ViewState["uciSaltOkunur"]; }
            set { ViewState["uciSaltOkunur"] = value; KontrolunReadOnlyDurumunuAyarla(value); }
        }

        #endregion

        private void KontrolVisibleAyari(bool pVisible)
        {
            HtmlControl tablo = (HtmlControl)this.FindControl("TableTarih");
            if (pVisible)
            {
                tablo.Style.Add("display", "block");
            }
            else
            {
                tablo.Style.Add("display", "none");
            }
        }

        private void MinumumTarihKaydet(DateTime pMinTar)
        {
            HiddenFieldMinTarYil.Value = pMinTar.Year.ToString();
            HiddenFieldMinTarAy.Value = pMinTar.Month.ToString();
            HiddenFieldMinTarGun.Value = pMinTar.Day.ToString();
        }
        private void MaksimumTarihKaydet(DateTime pMaksTar)
        {
            HiddenFieldMaksTarYil.Value = pMaksTar.Year.ToString();
            HiddenFieldMaksTarAy.Value = pMaksTar.Month.ToString();
            HiddenFieldMaksTarGun.Value = pMaksTar.Day.ToString();
        }

        private void KontrolunEnableDurumunuAyarla(bool value)
        {
            TextBoxGun.Enabled = value;
            TextBoxAy.Enabled = value;
            TextBoxYil.Enabled = value;
            ImageButtonTakvim.Enabled = value;
            ImageTemizle.Enabled = value;
        }
        private void KontrolunReadOnlyDurumunuAyarla(bool value)
        {
            TextBoxGun.Enabled = !value;
            TextBoxAy.Enabled = !value;
            TextBoxYil.Enabled = !value;
        }

        private void DogrulamaAyarla()
        {
            if (uciDogrulamaGrubu != String.Empty)
            {
                Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorGun, uciDogrulamaGrubu, "TextBoxGun");
                RequiredFieldValidatorGun.Text = "!";
                RequiredFieldValidatorGun.ErrorMessage = "Gün giriniz !";
                RequiredFieldValidatorGun.ToolTip = RequiredFieldValidatorGun.ErrorMessage;
                RequiredFieldValidatorGun.Visible = true;

                Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorAy, uciDogrulamaGrubu, "TextBoxAy");
                RequiredFieldValidatorAy.Text = "!";
                RequiredFieldValidatorAy.ErrorMessage = "Ay giriniz !";
                RequiredFieldValidatorAy.ToolTip = RequiredFieldValidatorAy.ErrorMessage;
                RequiredFieldValidatorAy.Visible = true;

                Dogrulama.MyRequiredFieldValidator(RequiredFieldValidatorYil, uciDogrulamaGrubu, "TextBoxYil");
                RequiredFieldValidatorYil.Text = "!";
                RequiredFieldValidatorYil.ErrorMessage = "Yıl giriniz !";
                RequiredFieldValidatorYil.ToolTip = RequiredFieldValidatorYil.ErrorMessage;
                RequiredFieldValidatorYil.Visible = true;
            }
            else
            {
                RequiredFieldValidatorGun.Visible = false;
                RequiredFieldValidatorAy.Visible = false;
                RequiredFieldValidatorYil.Visible = false;
            }
        }
        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime? ucoTarihAsNullable
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun.Text);
                    int ay = int.Parse(TextBoxAy.Text);
                    int yil = int.Parse(TextBoxYil.Text);

                    DateTime dt = new DateTime(yil, ay, gun);
                    return dt;
                }
                catch (Exception)
                {
                    return null; // DateTime.MinValue; eskiden Minumum sistem tarihi döndürülüyordu, ama istek üzerine değiştirildi 30.09.2009   
                }
            }
            set
            {
                if (value != null) SetDateTime(Convert.ToDateTime(value)); else VerilenTarihDegeriniSetle(String.Empty);
            }
        }


        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi DateTime tipinde döndürülür
        /// </summary>
        public DateTime ucoTarih
        {
            get
            {
                try
                {
                    int gun = int.Parse(TextBoxGun.Text);
                    int ay = int.Parse(TextBoxAy.Text);
                    int yil = int.Parse(TextBoxYil.Text);

                    DateTime dt = new DateTime(yil, ay, gun);
                    return dt;
                }
                catch (Exception)
                {
                    return DateTime.MinValue;
                }
            }
            set
            {
                if (value != null) SetDateTime(Convert.ToDateTime(value)); else VerilenTarihDegeriniSetle(String.Empty);
            }
        }

        /// <summary>
        /// Girilen tarih doğru ise aynen, değilse, minimum sistem tarihi string tipinde döndürülür
        /// </summary>
        public string ucoText
        {
            get { return TarihiStringOlarakDondur(); }
            set { VerilenTarihDegeriniSetle(value); }
        }

        private string TarihiStringOlarakDondur()
        {
            if (String.IsNullOrEmpty(TextBoxGun.Text) || String.IsNullOrEmpty(TextBoxAy.Text) || String.IsNullOrEmpty(TextBoxYil.Text))
                return String.Empty;
            else
                return string.Format("{0:dd.MM.yyyy}", ucoTarih);
        }

        private void VerilenTarihDegeriniSetle(string pDt)
        {
            if (String.IsNullOrEmpty(pDt))
            {
                TextBoxGun.Text = "";
                TextBoxAy.Text = "";
                TextBoxYil.Text = "";
            }
            else
            {
                if (TipDogrulama.IsDate(pDt)) SetDateTime(Convert.ToDateTime(pDt));
            }
        }

        private void SetDateTime(DateTime pDt)
        {
            TextBoxGun.Text = (String.Format("{0:00}", pDt.Day)).ToString();
            TextBoxAy.Text = (String.Format("{0:00}", pDt.Month)).ToString();
            TextBoxYil.Text = pDt.Year.ToString();
        }

    }

}
